//
// Created by Lin on 2023/3/26.
//23春伴学挑战赛02：C++语言  难度: 中
//考点: ASCII码 二维数组
// 用string方式, 不要求每行保留数字的个数
//题目描述
//查看题目信息
// http://www.aisichuang.com/ascts/change/toQuestionDetails.do?graType=0&queId=3189&claOrConId=136
//李老师受到经典的 “数字三角形” 问题的启发，将规律改成：
//
//f[i][j]=(f[i−1][j]+f[i−1][j+1])%10
//
//即：当前位置的数字 =(正上方的数字 + 右上方的数字)%10
//
//当给定第一行的 n 个数字 (0≤x≤9) 之后，则可以推导出一个 “倒置” 的数字三角形。
//
//例如 n=5 ，假设第一行的数字依次为 1,2,3,4,51,2,3,4,5 时，数字三角形为：
//
//12345
//3579
//826
//08
//8
//
//现在，李老师对它做出如下处理：每行只保留一个数字不变，其他的数字都用 ? “覆盖” 掉。
//
//例如：
//
//??3??
//3???
//??6
//0?
//8
//
//你的任务：根据给出的 “覆盖” 之后的数字三角形，推导出 “覆盖” 之前的数字三角形。
//输入格式
//
//第一行一个整数 n(2≤n≤50)，为数字三角形的行数。
//
//接下来的 n 行，第 1 行有 n 个数字，第 2 行有 n−1 个数字，第 3 行有 n−2 个数字，……，第 n 行有 1 个数字，被 “覆盖” 的数字均用 ? 表示。
//输出格式
//
//输出 “覆盖” 之前的数字三角形。
//样例输入
//
//5
//??3??
//3???
//??6
//0?
//8
//
//样例输出
//
//12345
//3579
//826
//08
//8

#include <iostream>

using namespace std;

int main()
{
    int n ;
    cin>>n;
    string arr[n];
    // 存储string的数组, 每个string又是个数组, 相当于是二维数组
//    n=5;
//    string arr[] = {"??3??",
//                    "3???",
//                    "??6",
//                    "?8",
//                    "8"};
    for (int i = 0; i < n; ++i)
    {
        cin>>arr[i];
    }
    for (int j = n - 2; j >= 0; --j)
    {
        while (int(arr[j].find('?'))>= 0)
        {
//            printf("find: %d\n",arr[j].find('?') );
            for (int i = 0; i < arr[j].size(); ++i)
            {
                // if '?' is on right and is not on the leftest
                // a ?
                // b
                if (i - 1 >= 0 and arr[j][i] == '?' and arr[j][i - 1] != '?')
                {
                    int down_left = arr[j + 1][i - 1] - 48;
                    int left = arr[j][i - 1] - 48;
                    int q = left > down_left ? ((10 - left + down_left) % 10) : down_left - left;
                    arr[j][i] = char(q + 48);
//                    printf("arr[%d][%d]: %c\n", j, i, arr[j][i]);

                    // if '?' is on left
                    // ? a
                    // b
                } else if (i+1<arr[j].size() and arr[j][i] == '?' and arr[j][i + 1] != '?')
                {
                    int down = arr[j + 1][i] - 48;
                    int right = arr[j][i + 1] - 48;
                    int q = right > down ? ((10 - right + down) % 10) : down - right;
                    arr[j][i] = char(q + 48);
                }
            }
        }
    }
    // 打印最终结果
    for (int j = 0; j < n; ++j)
    {
        printf("%s\n", arr[j].c_str());
    }

    return 0;
}

